Skip to content

feat(plan-feature): add parent issue linking step#224

Merged
mrizzi merged 1 commit into
mainfrom
TC-4870
Jul 2, 2026
Merged

feat(plan-feature): add parent issue linking step#224
mrizzi merged 1 commit into
mainfrom
TC-4870

Conversation

@mrizzi

@mrizzi mrizzi commented Jul 2, 2026

Copy link
Copy Markdown
Collaborator

Summary

  • Add Step 1.5 to plan-feature that optionally links a Feature to a parent issue (e.g., Outcome) in the Jira hierarchy
  • Validate that the parent's hierarchyLevel is strictly higher than the Feature's before setting the link
  • Add REST API fallback entry for jira.edit_issue(id, parent) and include Step 1.5 in the JIRA operations list
  • Add constraint 1.82 to docs/constraints.md with traceability index update

Implements TC-4870

Test plan

  • Verify Step 1.5 is correctly placed after Step 1 and before Step 2 (repository analysis is Step 3)
  • Verify the validation logic checks hierarchyLevel comparison (parent must be strictly higher)
  • Verify skip behavior (pressing Enter) preserves current workflow with no side effects
  • Verify existing-parent check avoids overwriting without user confirmation
  • Verify REST API fallback command syntax matches jira-client.py update_issue pattern
  • Verify constraint 1.82 has correct source reference to plan-feature/SKILL.md — Step 1.5

🤖 Generated with Claude Code

Summary by Sourcery

Introduce an optional step in the plan-feature workflow to link a Feature to a validated parent issue in the Jira hierarchy, with supporting REST fallback and documentation updates.

New Features:

  • Add Step 1.5 to the plan-feature skill to optionally link a Feature issue to a parent Jira issue while preserving existing behavior when skipped.

Enhancements:

  • Extend Jira REST fallback mappings to support editing an issue's parent via update_issue.
  • Update plan-feature skill documentation to describe the new parent-linking workflow and reference it in the JIRA operations list.

Documentation:

  • Add constraint 1.82 documenting that parent issue linking must validate that the parent issue's hierarchyLevel is higher than the Feature's before setting the link.
  • Update constraint source mapping to include the new Step 1.5 parent linking in the plan-feature SKILL.md.

Add Step 1.5 to plan-feature that optionally links a Feature to a
parent issue (e.g., Outcome) in the Jira hierarchy. Validates that
the parent's hierarchyLevel is strictly higher than the Feature's
before setting the link. Includes REST API fallback and a new
constraint (1.82) in docs/constraints.md.

Implements TC-4870

Assisted-by: Claude Code
@sourcery-ai

sourcery-ai Bot commented Jul 2, 2026

Copy link
Copy Markdown
Contributor

Reviewer's Guide

Adds an optional Step 1.5 to plan-feature for linking a Feature to a valid higher-level parent issue in Jira, wires this step into the JIRA access and REST fallback workflow, and records the hierarchy validation requirement as a new documented constraint with traceability updates.

Sequence diagram for new Step 1.5 Feature parent linking workflow

sequenceDiagram
  actor User
  participant PlanFeatureSkill
  participant Jira

  User->>PlanFeatureSkill: invoke plan-feature
  PlanFeatureSkill->>Jira: jira.get_issue(feature_key) (Step1)
  Jira-->>PlanFeatureSkill: Feature issue (includes parent, hierarchyLevel)

  PlanFeatureSkill->>PlanFeatureSkill: [check Feature.parent]
  alt Feature already has parent
    PlanFeatureSkill->>User: show current parent and ask keep_or_change
    opt user keeps parent
      PlanFeatureSkill->>User: proceed to Step2
    end
    opt user changes parent
      PlanFeatureSkill->>User: prompt for parent issue key or Enter to skip
    end
  else no existing parent
    PlanFeatureSkill->>User: prompt for parent issue key or Enter to skip
  end

  alt User provides parent_key
    PlanFeatureSkill->>Jira: jira.get_issue(parent_key)
    Jira-->>PlanFeatureSkill: Parent issue (fields.issuetype.hierarchyLevel)
    PlanFeatureSkill->>PlanFeatureSkill: [validate parent hierarchyLevel > Feature hierarchyLevel]
    alt hierarchy valid
      PlanFeatureSkill->>Jira: jira.edit_issue(feature_key, fields={parent:{key:parent_key}})
      Jira-->>PlanFeatureSkill: parent link updated
      PlanFeatureSkill->>User: confirm parent linked
    else hierarchy invalid
      PlanFeatureSkill->>User: inform hierarchy mismatch and re-prompt
    end
  else User presses Enter
    PlanFeatureSkill->>User: skip Step1.5 and proceed to Step2
  end
Loading

File-Level Changes

Change Details Files
Introduce Step 1.5 in the plan-feature workflow to optionally link a Feature issue to a validated parent issue in the Jira hierarchy.
  • Insert a new Step 1.5 section describing parent linking immediately after Step 1 in the plan-feature skill documentation.
  • Define logic to detect an existing parent on the Feature, prompt the user to keep or change it, and skip modification if the user keeps the current parent.
  • Specify an interactive prompt for entering a parent issue key or pressing Enter to skip, making the step optional.
  • Describe validation flow for the parent key using jira.get_issue, including existence checks and hierarchyLevel comparison against the Feature.
  • Clarify allowed hierarchy levels (parent must be level 3+ and strictly higher than Feature level 2, excluding Epic and Task).
  • Document the update operation using jira.edit_issue with a parent field to set the parent link on the Feature issue.
  • State that skipping (empty input) must proceed without linking or side effects.
plugins/sdlc-workflow/skills/plan-feature/SKILL.md
Integrate the new parent-linking step into the JIRA access initialization and REST fallback command mapping.
  • Update the Step 0.5 description so JIRA access initialization explicitly covers the new Step 1.5 alongside existing JIRA operations.
  • Add a REST API fallback entry defining how jira.edit_issue(id, parent) maps to jira-client.py update_issue with a parent fields JSON payload.
plugins/sdlc-workflow/skills/plan-feature/SKILL.md
Document a new formal constraint requiring hierarchy validation for parent linking and update traceability references accordingly.
  • Add constraint 1.82 to the constraints list stating that parent issue linking must validate the parent issue’s hierarchyLevel as higher than the Feature’s before setting the link.
  • Update the constraints source table to reference Step 1.5 in plan-feature/SKILL.md as the origin of constraint 1.82 and include it in the plan-feature source summary line.
docs/constraints.md

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

@sourcery-ai sourcery-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey - I've left some high level feedback:

  • In Step 1.5, consider explicitly stating that the selected parent cannot be the same issue as the Feature (and ideally cannot create a cycle), so the validation step enforces a non-self, acyclic hierarchy in addition to the hierarchyLevel check.
  • When describing the existing-parent flow in Step 1.5, it might help to clarify what happens if the user chooses to change the parent (e.g., whether the old parent link is overwritten unconditionally after successful validation of the new parent).
Prompt for AI Agents
Please address the comments from this code review:

## Overall Comments
- In Step 1.5, consider explicitly stating that the selected parent cannot be the same issue as the Feature (and ideally cannot create a cycle), so the validation step enforces a non-self, acyclic hierarchy in addition to the `hierarchyLevel` check.
- When describing the existing-parent flow in Step 1.5, it might help to clarify what happens if the user chooses to change the parent (e.g., whether the old parent link is overwritten unconditionally after successful validation of the new parent).

Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Eval Results

Eval Results: plan-feature

Eval Passed Failed Pass Rate
eval-1 11/16 5 69%
eval-2 8/14 6 57%
eval-3 9/15 6 60%
eval-4 6/11 5 55%
eval-5 8/15 7 53%
eval-6 6/14 8 43%

Failed Assertions

eval-1: 5 failing assertions
  • Assertion: "After each task is created, a description digest comment is posted with a format-tagged SHA-256 hash — exactly 64 lowercase hex characters prefixed by 'sha256-md:' or 'sha256-adf:', not a placeholder, abbreviated value, or example string. Marker format: '[sdlc-workflow] Description digest: sha256-md:<64-char-hex>' (or sha256-adf). The digest is computed by re-fetching the description from the API and running scripts/sha256-digest.py"
    Evidence: "None of the 4 task files or the impact-map.md contain any reference to SHA-256 hashes, digest comments, or the '[sdlc-workflow] Description digest:' marker. No separate files for digest comments exist in the outputs directory. The output directory contains only: impact-map.md, task-1-advisory-severity-model-and-service.md, task-2-advisory-summary-endpoint.md, task-3-cache-invalidation.md, task-4-integration-tests.md. No evidence of digest comment posting."

  • Assertion: "Convention-aware enrichment validates file-type applicability per shared/convention-applicability-rules.md before including a convention — inapplicable conventions are excluded entirely (not listed with 'Not applicable' annotations), and applicable ones include a rationale in the prescribed format ('Applies: task modifies <file> matching the convention's <scope>'), not free-form prose"
    Evidence: "None of the 4 task files contain any reference to CONVENTIONS.md, convention applicability, or the prescribed rationale format 'Applies: task modifies <file> matching the convention's <scope>'. The Implementation Notes sections reference docs/constraints.md (e.g., 'Per docs/constraints.md section 5 (Code Change Rules)') but contain no convention-aware enrichment. The repo-backend.md structure includes a CONVENTIONS.md file at the root, but no conventions from it appear in the task descriptions. No evidence of convention applicability validation occurring."

  • Assertion: "When the Feature issue has a priority set (not 'Undefined'), every created task's additional_fields includes 'priority' with the inherited priority name. When the Feature's priority is 'Undefined', the priority key is omitted entirely from additional_fields (not set to null or 'Undefined')"
    Evidence: "None of the 4 task files contain any reference to 'priority', 'additional_fields', or priority inheritance/propagation. The task descriptions contain only the standard template sections (Repository, Target Branch, Description, Files to Modify/Create, Implementation Notes, Acceptance Criteria, Test Requirements, Dependencies). No evidence of priority field handling."

  • Assertion: "When the Feature issue has a non-empty fixVersions array and the fixVersion scope config (from ### Jira Field Defaults in CLAUDE.md) is 'task' or 'both' (or absent, defaulting to 'both'), every created task's additional_fields includes 'fixVersions' with the inherited version(s). When fixVersion scope is 'feature' or the Feature has no fixVersions, the fixVersions key is omitted entirely from additional_fields"
    Evidence: "None of the 4 task files contain any reference to 'fixVersions', 'fixVersion', 'additional_fields', or version inheritance/propagation. No evidence of fixVersion field handling in any output file."

  • Assertion: "The summary comment on the feature issue (Step 6c) includes the inherited priority and fixVersion values that were propagated to tasks, or states they were omitted and why"
    Evidence: "No summary comment file exists in the outputs directory. The only files present are impact-map.md and 4 task description files. None of these files contain a summary comment section that mentions priority or fixVersion propagation. No evidence of a Step 6c summary comment."

eval-2: 6 failing assertions
  • Assertion: "Tasks document assumptions where they fill in missing details, labeled as assumptions pending clarification"
    Evidence: "The impact map documents assumptions in the Ambiguity Analysis table with an 'Assumption' column header, but they are not labeled as 'pending clarification.' The individual task description files (task-1 through task-4) fill in missing details but do not label them as assumptions at all. For example, task-3 notes 'The feature requirement specifies some kind of filtering capability without detailing specific filters. This task adds the most commonly needed filters...' but does not label this as an assumption pending clarification. No output file uses the phrase 'pending clarification' or explicitly marks individual assumptions within task descriptions."

  • Assertion: "After each task is created, a description digest comment is posted with a format-tagged SHA-256 hash — exactly 64 lowercase hex characters prefixed by 'sha256-md:' or 'sha256-adf:', not a placeholder, abbreviated value, or example string. Marker format: '[sdlc-workflow] Description digest: sha256-md:<64-char-hex>' (or sha256-adf). The digest is computed by re-fetching the description from the API and running scripts/sha256-digest.py"
    Evidence: "None of the 5 output files (impact-map.md, task-1 through task-4) contain any reference to SHA-256 hashes, digest comments, 'sha256-md:', 'sha256-adf:', '[sdlc-workflow]', or 'Description digest'. No separate digest comment files exist in the outputs directory. The eval produced only impact-map.md and 4 task description files with no digest documentation."

  • Assertion: "Convention-aware enrichment validates file-type applicability per shared/convention-applicability-rules.md before including a convention — inapplicable conventions are excluded entirely (not listed with 'Not applicable' annotations), and applicable ones include a rationale in the prescribed format ('Applies: task modifies <file> matching the convention's <scope>'), not free-form prose"
    Evidence: "None of the 4 task description files contain any convention-aware enrichment. There are no 'Per CONVENTIONS.md' references, no 'Applies:' rationale lines, and no mention of CONVENTIONS.md or convention applicability anywhere in the Implementation Notes or elsewhere in any output file. The repo-backend.md indicates a CONVENTIONS.md exists in the repository, but the plan did not apply convention-aware enrichment to any task."

  • Assertion: "When the Feature issue has a priority set (not 'Undefined'), every created task's additional_fields includes 'priority' with the inherited priority name. When the Feature's priority is 'Undefined', the priority key is omitted entirely from additional_fields (not set to null or 'Undefined')"
    Evidence: "The feature TC-9002 has Priority: Normal (not Undefined), so every task should include priority propagation. However, none of the 4 task description files contain any reference to 'additional_fields', 'priority', 'Normal', or any Jira field inheritance/propagation. No separate output file documents priority propagation."

  • Assertion: "When the Feature issue has a non-empty fixVersions array and the fixVersion scope config (from ### Jira Field Defaults in CLAUDE.md) is 'task' or 'both' (or absent, defaulting to 'both'), every created task's additional_fields includes 'fixVersions' with the inherited version(s). When fixVersion scope is 'feature' or the Feature has no fixVersions, the fixVersions key is omitted entirely from additional_fields"
    Evidence: "The feature TC-9002 has Fix Versions: RHTPA 1.6.0 (non-empty). CLAUDE.md has no '### Jira Field Defaults' section, so fixVersion scope defaults to 'both', meaning fixVersions should propagate to tasks. However, none of the 4 task files contain any reference to 'fixVersions', 'additional_fields', 'RHTPA', or version propagation. No output file documents fixVersion inheritance."

  • Assertion: "The summary comment on the feature issue (Step 6c) includes the inherited priority and fixVersion values that were propagated to tasks, or states they were omitted and why"
    Evidence: "No summary comment file exists in the outputs directory. The impact map does not contain a summary comment section, and none of the output files mention priority propagation ('Normal') or fixVersion propagation ('RHTPA 1.6.0'). The outputs consist only of impact-map.md and 4 task description files with no Step 6c summary comment."

eval-3: 6 failing assertions
  • Assertion: "UI-facing frontend tasks (pages, components) reference Figma design context mentioning specific PatternFly components and visual specifications — API-layer frontend tasks (API types, client functions, hooks) are exempt from this requirement"
    Evidence: "Task 3 (API types/hook) is API-layer and exempt. Task 4 (comparison page) extensively references Figma ('based on the Figma design', '(from Figma design)' multiple times) and PatternFly components (Select, ExpandableSection, Badge, Table, EmptyState, Skeleton, Dropdown, CodeBranchIcon) with visual specs (badge colors, critical highlight). However, Task 5 modifies the SbomListPage UI (adds checkbox selection column and 'Compare selected' button) — it mentions 'PatternFly's composable Table select pattern' but does NOT reference Figma design context. Since Task 5 modifies a page's UI, it is UI-facing, yet lacks Figma context."

  • Assertion: "Cross-repo dependency ordering is enforced: either at least one frontend task explicitly depends on a backend task in its Dependencies section, or all tasks target a shared feature branch where backend tasks have lower task numbers than frontend tasks (implicit ordering via feature-branch workflow)"
    Evidence: "No frontend task explicitly depends on a backend task. Task 3 Dependencies: 'None (API types can be built from the contract specification; backend endpoint existence is a deployment dependency, not a code dependency)'. Task 4 depends on Task 3 (frontend). Task 5 depends on Task 4 (frontend). For the alternative, all tasks target 'main' (direct-to-main workflow per impact-map.md), not a shared feature branch. 'main' is the default branch, not a feature branch, so the implicit ordering via feature-branch workflow does not apply."

  • Assertion: "After each task is created, a description digest comment is posted with a format-tagged SHA-256 hash — exactly 64 lowercase hex characters prefixed by 'sha256-md:' or 'sha256-adf:', not a placeholder, abbreviated value, or example string. Marker format: '[sdlc-workflow] Description digest: sha256-md:<64-char-hex>' (or sha256-adf). The digest is computed by re-fetching the description from the API and running scripts/sha256-digest.py"
    Evidence: "None of the 6 output files (impact-map.md, task-1 through task-5) contain any SHA-256 digest comment, '[sdlc-workflow] Description digest:' marker, or any reference to digest computation. No separate digest comment files exist in the outputs directory. There is zero evidence of digest comments being posted or documented."

  • Assertion: "When the Feature issue has a priority set (not 'Undefined'), every created task's additional_fields includes 'priority' with the inherited priority name. When the Feature's priority is 'Undefined', the priority key is omitted entirely from additional_fields (not set to null or 'Undefined')"
    Evidence: "None of the 5 task description files contain any mention of 'additional_fields', 'priority', or priority propagation. The impact-map.md also contains no priority information. There is no evidence in any output file that priority was considered, inherited, or propagated to tasks."

  • Assertion: "When the Feature issue has a non-empty fixVersions array and the fixVersion scope config (from ### Jira Field Defaults in CLAUDE.md) is 'task' or 'both' (or absent, defaulting to 'both'), every created task's additional_fields includes 'fixVersions' with the inherited version(s). When fixVersion scope is 'feature' or the Feature has no fixVersions, the fixVersions key is omitted entirely from additional_fields"
    Evidence: "None of the 5 task description files contain any mention of 'additional_fields', 'fixVersions', or version propagation. The impact-map.md also contains no fixVersion information. There is no evidence in any output file that fixVersions was considered, inherited, or propagated to tasks."

  • Assertion: "The summary comment on the feature issue (Step 6c) includes the inherited priority and fixVersion values that were propagated to tasks, or states they were omitted and why"
    Evidence: "No summary comment file exists in the outputs directory. The impact-map.md contains a Task Summary table but no mention of priority or fixVersion propagation. None of the 6 output files contain any summary comment about inherited priority or fixVersion values, nor any explanation of why they were omitted."

eval-4: 5 failing assertions
  • Assertion: "After each task is created, a description digest comment is posted with a format-tagged SHA-256 hash — exactly 64 lowercase hex characters prefixed by 'sha256-md:' or 'sha256-adf:', not a placeholder, abbreviated value, or example string. Marker format: '[sdlc-workflow] Description digest: sha256-md:<64-char-hex>' (or sha256-adf). The digest is computed by re-fetching the description from the API and running scripts/sha256-digest.py"
    Evidence: "No digest comments found anywhere in the output files. The outputs directory contains only impact-map.md and 6 task files (task-1 through task-6). None of these files contain '[sdlc-workflow] Description digest:', 'sha256-md:', 'sha256-adf:', or any SHA-256 hash strings. No separate digest comment files exist in the outputs directory."

  • Assertion: "Convention-aware enrichment validates file-type applicability per shared/convention-applicability-rules.md before including a convention — inapplicable conventions are excluded entirely (not listed with 'Not applicable' annotations), and applicable ones include a rationale in the prescribed format ('Applies: task modifies <file> matching the convention's <scope>'), not free-form prose"
    Evidence: "No convention-aware enrichment is present in any of the 6 task files. None of the task descriptions contain 'Per CONVENTIONS.md', 'Applies:', or any convention applicability rationale text. The target repository (trustify-backend) has a CONVENTIONS.md file listed in its directory tree (repo-backend.md line 15), which means conventions exist that should have been evaluated for applicability. The Implementation Notes sections in all tasks reference code patterns and file paths but contain zero convention references with the prescribed rationale format."

  • Assertion: "When the Feature issue has a priority set (not 'Undefined'), every created task's additional_fields includes 'priority' with the inherited priority name. When the Feature's priority is 'Undefined', the priority key is omitted entirely from additional_fields (not set to null or 'Undefined')"
    Evidence: "The Feature issue TC-9004 has Priority set to 'Major' (feature-adversarial.md line 6). Therefore every created task should include additional_fields with priority 'Major'. However, none of the 6 task files contain 'additional_fields', 'priority', or 'Major' anywhere in their content. The priority was not propagated to any task."

  • Assertion: "When the Feature issue has a non-empty fixVersions array and the fixVersion scope config (from ### Jira Field Defaults in CLAUDE.md) is 'task' or 'both' (or absent, defaulting to 'both'), every created task's additional_fields includes 'fixVersions' with the inherited version(s). When fixVersion scope is 'feature' or the Feature has no fixVersions, the fixVersions key is omitted entirely from additional_fields"
    Evidence: "The Feature issue TC-9004 has Fix Versions set to 'RHTPA 1.5.0' (feature-adversarial.md line 7). The project CLAUDE.md does not contain a '### Jira Field Defaults' section, so the fixVersion scope defaults to 'both', meaning fixVersions should be propagated to tasks. However, none of the 6 task files contain 'additional_fields', 'fixVersions', or 'RHTPA 1.5.0' anywhere in their content. The fixVersions were not propagated to any task."

  • Assertion: "The summary comment on the feature issue (Step 6c) includes the inherited priority and fixVersion values that were propagated to tasks, or states they were omitted and why"
    Evidence: "No summary comment file exists in the outputs directory. The outputs contain only impact-map.md and 6 task files (task-1 through task-6). None of these files contain a summary comment section referencing Step 6c, priority propagation ('Major'), fixVersion propagation ('RHTPA 1.5.0'), or any explanation of omission. No file documents the summary of what was propagated to tasks."

eval-5: 7 failing assertions
  • Assertion: "Each task file contains all required template sections: Repository, Target Branch, Description, at least one of Files to Modify or Files to Create, Implementation Notes, Acceptance Criteria, Test Requirements"
    Evidence: "Intermediate tasks (2-6) all contain every required section. However, bookend tasks fail: task-1-create-feature-branch.md has no 'Files to Modify', 'Files to Create', or 'Implementation Notes' sections. task-7-merge-feature-branch.md similarly has no 'Files to Modify', 'Files to Create', or 'Implementation Notes' sections. The assertion says 'Each task file' without exception."

  • Assertion: "The plan includes a workflow:feature-branch label decision to be applied to the feature issue"
    Evidence: "No mention of a 'workflow:feature-branch' label appears anywhere in the output files. The impact-map.md states 'Workflow Mode: feature-branch' as a heading but does not reference applying a label to the feature issue. Grep across all output files for 'label' returned zero matches."

  • Assertion: "After each task is created, a description digest comment is posted with a format-tagged SHA-256 hash — exactly 64 lowercase hex characters prefixed by 'sha256-md:' or 'sha256-adf:', not a placeholder, abbreviated value, or example string. Marker format: '[sdlc-workflow] Description digest: sha256-md:<64-char-hex>' (or sha256-adf). The digest is computed by re-fetching the description from the API and running scripts/sha256-digest.py"
    Evidence: "No output file contains any mention of 'digest', 'sha256', '[sdlc-workflow]', or any hash values. There are no separate files documenting digest comment operations. Grep across all outputs for 'sha256' and 'digest' returned zero matches."

  • Assertion: "Convention-aware enrichment validates file-type applicability per shared/convention-applicability-rules.md before including a convention — inapplicable conventions are excluded entirely (not listed with 'Not applicable' annotations), and applicable ones include a rationale in the prescribed format ('Applies: task modifies <file> matching the convention's <scope>'), not free-form prose"
    Evidence: "No output file contains any mention of 'convention', 'applicab', or the prescribed rationale format 'Applies: task modifies'. There is no evidence of convention-aware enrichment or validation in any task file."

  • Assertion: "When the Feature issue has a priority set (not 'Undefined'), every created task's additional_fields includes 'priority' with the inherited priority name. When the Feature's priority is 'Undefined', the priority key is omitted entirely from additional_fields (not set to null or 'Undefined')"
    Evidence: "No output file contains any mention of 'priority', 'additional_fields', or any priority propagation logic. Grep across all outputs for 'priority' returned zero matches."

  • Assertion: "When the Feature issue has a non-empty fixVersions array and the fixVersion scope config (from ### Jira Field Defaults in CLAUDE.md) is 'task' or 'both' (or absent, defaulting to 'both'), every created task's additional_fields includes 'fixVersions' with the inherited version(s). When fixVersion scope is 'feature' or the Feature has no fixVersions, the fixVersions key is omitted entirely from additional_fields"
    Evidence: "No output file contains any mention of 'fixVersion', 'fixVersions', 'additional_fields', or version propagation. Grep across all outputs for 'fixVersion' returned zero matches."

  • Assertion: "The summary comment on the feature issue (Step 6c) includes the inherited priority and fixVersion values that were propagated to tasks, or states they were omitted and why"
    Evidence: "No output file contains a summary comment or any mention of a summary comment being posted to the feature issue. There is no file documenting priority or fixVersion propagation in a summary. Grep across all outputs for 'summary comment' returned zero matches."

eval-6: 8 failing assertions
  • Assertion: "Each task specifies its parent Epic key in the output — tasks targeting trustify-backend are assigned to the backend Epic, tasks targeting trustify-ui are assigned to the frontend Epic"
    Evidence: "The individual task files (task-1 through task-6) do not contain any parent Epic key field. The impact-map.md table maps tasks to epics (Tasks 1-3 to 'TC-9006: trustify-backend', Tasks 4-6 to 'TC-9006: trustify-ui'), but the task description files themselves have no Epic key reference. No epic issue keys (e.g., TC-9007, TC-9008) are mentioned in any task file."

  • Assertion: "Incorporates links are created from the Feature to each Epic (not from Feature to individual Tasks)"
    Evidence: "No output file contains any mention of 'Incorporates' links, issue linking, or link creation from the Feature to Epics. The impact-map.md describes epic grouping but does not document link creation. No separate file documents Jira link operations."

  • Assertion: "Epics are created with the level-1 issue type name ('Epic') and parent set to the feature issue key"
    Evidence: "No output file documents the issue type name used for epic creation or the parent field. The impact-map.md mentions epics by summary name but does not specify the Jira issue type name ('Epic') or parent configuration. No separate epic creation output exists."

  • Assertion: "After each task is created, a description digest comment is posted with a format-tagged SHA-256 hash — exactly 64 lowercase hex characters prefixed by 'sha256-md:' or 'sha256-adf:', not a placeholder, abbreviated value, or example string. Marker format: '[sdlc-workflow] Description digest: sha256-md:<64-char-hex>' (or sha256-adf). The digest is computed by re-fetching the description from the API and running scripts/sha256-digest.py"
    Evidence: "No output file contains any SHA-256 hash, 'sha256-md:', 'sha256-adf:', 'Description digest', or '[sdlc-workflow]' marker. None of the 7 output files (impact-map.md and 6 task files) document digest comment posting. No separate digest comment files exist in the outputs directory."

  • Assertion: "Convention-aware enrichment validates file-type applicability per shared/convention-applicability-rules.md before including a convention — inapplicable conventions are excluded entirely (not listed with 'Not applicable' annotations), and applicable ones include a rationale in the prescribed format ('Applies: task modifies <file> matching the convention's <scope>'), not free-form prose"
    Evidence: "No task file contains any convention references, 'Per CONVENTIONS.md' citations, 'Applies:' rationale lines, or any evidence of convention-aware enrichment. The Implementation Notes sections in all 6 task files contain implementation guidance but no convention applicability validation or prescribed-format rationale. There is no evidence that the convention enrichment process was executed."

  • Assertion: "When the Feature issue has a priority set (not 'Undefined'), every created task's additional_fields includes 'priority' with the inherited priority name. When the Feature's priority is 'Undefined', the priority key is omitted entirely from additional_fields (not set to null or 'Undefined')"
    Evidence: "No task file contains an 'additional_fields' section or any mention of priority inheritance. The word 'priority' does not appear in any of the 6 task description files. There is no evidence that priority propagation from the Feature issue was considered or implemented."

  • Assertion: "When the Feature issue has a non-empty fixVersions array and the fixVersion scope config (from ### Jira Field Defaults in CLAUDE.md) is 'task' or 'both' (or absent, defaulting to 'both'), every created task's additional_fields includes 'fixVersions' with the inherited version(s). When fixVersion scope is 'feature' or the Feature has no fixVersions, the fixVersions key is omitted entirely from additional_fields"
    Evidence: "No task file contains an 'additional_fields' section or any mention of fixVersions. The term 'fixVersion' does not appear in any of the 6 task description files. There is no evidence that fixVersion propagation was considered or implemented."

  • Assertion: "The summary comment on the feature issue (Step 6c) includes the inherited priority and fixVersion values that were propagated to tasks, or states they were omitted and why"
    Evidence: "No output file contains a summary comment for the feature issue. There is no file documenting Step 6c output, no mention of inherited priority or fixVersion values in any output file, and no explanation of omission. The outputs directory contains only the impact map and 6 task description files."

Pass rate: 56% · Tokens: 65,059 · Duration: 232s

Baseline (d573976e): 56% · 60,925 tokens · 210s


Generated by sdlc-workflow/run-evals v0.11.1

@mrizzi

mrizzi commented Jul 2, 2026

Copy link
Copy Markdown
Collaborator Author

[sdlc-workflow/verify-pr] Re: @sourcery-ai[bot] review — 2 items classified:

  1. Suggestion (self-reference/cycle check) — proposes adding explicit self-reference and cycle validation. The existing hierarchyLevel check (parent must be strictly higher) inherently prevents self-reference. Cycle detection is a valid enhancement but not documented in CONVENTIONS.md or demonstrated by codebase patterns. No sub-task created.

  2. Suggestion (overwrite behavior clarification) — proposes clarifying what happens when the user changes an existing parent. The current Step 1.5 handles this via the keep/change prompt, and jira.edit_issue overwrites unconditionally by API design. This is a documentation clarity suggestion with no convention backing. No sub-task created.

@mrizzi

mrizzi commented Jul 2, 2026

Copy link
Copy Markdown
Collaborator Author

Verification Report for TC-4870 (commit eef8892)

Check Result Details
Review Feedback PASS 2 suggestions from sourcery-ai — no code change requests
Root-Cause Investigation N/A No sub-tasks created
Scope Containment PASS PR modifies exactly the 2 files specified in the task
Diff Size PASS 47 lines across 2 files — proportionate for a new skill step + constraint
Commit Traceability PASS Commit contains "Implements TC-4870" and Assisted-by trailer
Sensitive Patterns PASS No sensitive patterns in added lines (documentation-only changes)
CI Status PASS All 4 CI checks pass
Acceptance Criteria PASS 8 of 8 criteria met
Test Quality PASS Eval Quality: PASS (56%, identical to baseline — all failures pre-existing)
Test Change Classification N/A No test files modified
Verification Commands N/A No verification commands specified

Overall: PASS

All checks pass. The PR correctly adds Step 1.5 (Link Feature to Parent Issue) to plan-feature with hierarchy validation, REST API fallback, and constraint 1.82 with traceability index update. Two reviewer suggestions (self-reference/cycle check and overwrite behavior clarification) were classified as suggestions with no convention backing — no sub-tasks created.


This comment was AI-generated by sdlc-workflow/verify-pr v0.11.1.

@mrizzi mrizzi merged commit 40c31ac into main Jul 2, 2026
4 checks passed
@mrizzi mrizzi deleted the TC-4870 branch July 2, 2026 07:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant